package com.example.leetcode.trainingcamp.week8.sunday;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**数字 n 代表生成括号的对数，请你设计一个函数，用于能够生成所有可能的并且 有效的 括号组合。

 有效括号组合需满足：左括号必须以正确的顺序闭合。

  

 示例 1：

 输入：n = 3
 输出：["((()))","(()())","(())()","()(())","()()()"]

 来源：力扣（LeetCode）
 链接：https://leetcode-cn.com/problems/generate-parentheses
 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Test22 {

    private List<String> result = new ArrayList<>();

    public List<String> generateParenthesis(int n) {
        append(n,new StringBuilder(),0);
        return result;
    }

    public void append(int n ,StringBuilder sb,int begin){
        if (begin == n *2 ){
            if (is(sb.toString())){
                result.add(sb.toString());
            }
            return;
        }
        sb.append("(");
        append(n,sb,begin+1);
        sb.deleteCharAt(begin);
        sb.append(")");
        append(n,sb,begin+1);
        sb.deleteCharAt(begin);
    }

    public boolean is(String s){
        Stack<Character> stack = new Stack<>();
        for(int i =0;i<s.length();i++){
            if (s.charAt(i) == '(') stack.push(s.charAt(i));
            else {
                if (!stack.isEmpty()){
                    stack.pop();
                }else {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}


class Demo22{
    public static void main(String[] args) {
        Test22 t = new Test22();
        List<String> list = t.generateParenthesis(3);
        for (String s:list) {
            System.out.println(s);
        }
    }
}